大家好,我是正在实战各种 AI 项目的程序员晚枫。

😫 开篇:Docker 部署是我见过最优雅的部署方式

"晚枫,有没有一种部署方式,能在任何云平台通用?"

有!Docker 容器化部署。一次打包,到处运行,阿里云腾讯云华为云 AWS 通吃

今天把 Docker 部署 OpenClaw 的完整手册整理出来,照着做,20 分钟搞定。

📋 部署前准备

1. 基础要求

1
2
3
4
✓ 任意 Linux 服务器(Ubuntu/CentOS/Debian)
✓ 2 核 4G 以上配置
✓ 能访问外网(下载镜像)
✓ Docker 环境(没有的话我来教你装)

2. 为什么选 Docker?

对比项传统部署Docker 部署
环境配置每台服务器都要配一次配置,到处运行
依赖管理容易冲突容器隔离,互不影响
版本升级复杂,容易出错换镜像即可,秒级回滚
迁移麻烦,要重新配置复制镜像就行
扩展手动部署自动扩缩容

结论:Docker 是未来,传统部署是过去。

🚀 部署步骤(超详细)

第 1 步:安装 Docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Ubuntu/Debian
curl -fsSL https://get.docker.com | bash
systemctl enable docker
systemctl start docker

# CentOS
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl enable docker
systemctl start docker

# 验证安装
docker --version
docker run hello-world

第 2 步:安装 Docker Compose

1
2
3
4
5
6
7
8
# 下载最新版本
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 添加执行权限
chmod +x /usr/local/bin/docker-compose

# 验证
docker-compose --version

第 3 步:准备项目文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建项目目录
mkdir -p /opt/openclaw
cd /opt/openclaw

# 克隆代码
git clone https://github.com/openclaw/openclaw.git
cd openclaw

# 目录结构
# openclaw/
# ├── docker-compose.yml # Docker Compose 配置
# ├── .env # 环境变量
# ├── app/ # 应用代码
# ├── static/ # 静态文件
# └── data/ # 数据目录

第 4 步:配置环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 创建 .env 文件
cat > .env << EOF
# 应用配置
OPENCLAW_PORT=8000
OPENCLAW_HOST=0.0.0.0
OPENCLAW_ENV=production

# 数据库配置
DATABASE_URL=postgresql://openclaw:secure_password_123@postgres:5432/openclaw
POSTGRES_USER=openclaw
POSTGRES_PASSWORD=secure_password_123
POSTGRES_DB=openclaw

# Redis 配置
REDIS_URL=redis://redis:6379/0

# 安全配置
SECRET_KEY=$(openssl rand -hex 32)
DEBUG=False

# 文件存储(可选,用本地或云存储)
MEDIA_ROOT=/app/data/media
STATIC_ROOT=/app/data/static
EOF

# ⚠️ 重要:生产环境要修改密码和 SECRET_KEY

第 5 步:配置 Docker Compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# docker-compose.yml
version: '3.8'

services:
# OpenClaw 应用
app:
build: .
ports:
- "${OPENCLAW_PORT}:8000"
environment:
- DATABASE_URL=${DATABASE_URL}
- REDIS_URL=${REDIS_URL}
- SECRET_KEY=${SECRET_KEY}
- DEBUG=${DEBUG}
volumes:
- ./data/media:/app/data/media
- ./data/static:/app/data/static
depends_on:
- postgres
- redis
restart: unless-stopped
networks:
- openclaw-network

# PostgreSQL 数据库
postgres:
image: postgres:14-alpine
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
volumes:
- postgres-data:/var/lib/postgresql/data
restart: unless-stopped
networks:
- openclaw-network

# Redis 缓存
redis:
image: redis:7-alpine
command: redis-server --appendonly yes
volumes:
- redis-data:/data
restart: unless-stopped
networks:
- openclaw-network

# Nginx 反向代理
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./data/static:/usr/share/nginx/html/static:ro
- ./ssl:/etc/nginx/ssl:ro
depends_on:
- app
restart: unless-stopped
networks:
- openclaw-network

volumes:
postgres-data:
redis-data:

networks:
openclaw-network:
driver: bridge

第 6 步:配置 Nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# nginx.conf
events {
worker_connections 1024;
}

http {
upstream openclaw {
server app:8000;
}

server {
listen 80;
server_name your-domain.com;

# 重定向到 HTTPS
return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl http2;
server_name your-domain.com;

# SSL 证书
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;

# 安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;

# 静态文件
location /static/ {
alias /usr/share/nginx/html/static/;
expires 30d;
add_header Cache-Control "public, immutable";
}

# 媒体文件
location /media/ {
alias /usr/share/nginx/html/media/;
expires 7d;
}

# 反向代理
location / {
proxy_pass http://openclaw;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}

第 7 步:启动服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 构建并启动
docker-compose up -d --build

# 查看状态
docker-compose ps

# 查看日志
docker-compose logs -f

# 停止服务
docker-compose down

# 重启服务
docker-compose restart

第 8 步:配置 HTTPS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建 SSL 目录
mkdir -p ssl

# 用 Certbot 获取证书(需要 80 端口可用)
docker run --rm -it \
-v /etc/letsencrypt:/etc/letsencrypt \
-v /var/lib/letsencrypt:/var/lib/letsencrypt \
certbot/certbot certonly \
--standalone \
-d your-domain.com

# 复制证书到项目目录
cp /etc/letsencrypt/live/your-domain.com/fullchain.pem ssl/
cp /etc/letsencrypt/live/your-domain.com/privkey.pem ssl/

# 重启 Nginx
docker-compose restart nginx

🔧 常用运维命令

查看日志

1
2
3
4
5
6
7
8
9
# 查看所有服务日志
docker-compose logs

# 查看特定服务日志
docker-compose logs app
docker-compose logs nginx

# 实时查看日志
docker-compose logs -f app

进入容器

1
2
3
4
5
6
7
8
# 进入应用容器
docker-compose exec app bash

# 进入数据库容器
docker-compose exec postgres psql -U openclaw -d openclaw

# 进入 Redis 容器
docker-compose exec redis redis-cli

备份数据

1
2
3
4
5
6
7
8
9
10
11
# 备份数据库
docker-compose exec postgres pg_dump -U openclaw openclaw > backup_$(date +%Y%m%d).sql

# 恢复数据库
docker-compose exec -T postgres psql -U openclaw openclaw < backup_20260326.sql

# 备份整个数据卷
docker run --rm \
-v openclaw_postgres-data:/data \
-v $(pwd):/backup \
alpine tar czf /backup/postgres-backup.tar.gz /data

更新版本

1
2
3
4
5
6
7
8
9
# 拉取最新代码
git pull

# 重新构建并启动
docker-compose up -d --build

# 无停机更新(高级)
docker-compose pull
docker-compose up -d --force-recreate --no-deps app

扩容

1
2
3
4
# 增加应用实例数
docker-compose up -d --scale app=3

# 配合负载均衡使用

📊 性能优化建议

1. 资源限制

1
2
3
4
5
6
7
8
9
10
11
# docker-compose.yml 中添加
services:
app:
deploy:
resources:
limits:
cpus: '2'
memory: 2G
reservations:
cpus: '1'
memory: 1G

2. 健康检查

1
2
3
4
5
6
7
services:
app:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3

3. 日志管理

1
2
3
4
5
6
7
services:
app:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"

💰 成本优化技巧

1. 镜像优化

1
2
3
4
5
6
# 使用多阶段构建
FROM python:3.10-slim as builder
# 构建阶段...

FROM python:3.10-slim
# 运行阶段,只复制必要文件

2. 缓存优化

1
2
3
4
5
6
# 先复制依赖文件
COPY requirements.txt .
RUN pip install -r requirements.txt

# 再复制代码(利用缓存)
COPY . .

3. 资源优化

1
2
3
4
5
6
7
8
# 定期清理无用镜像
docker image prune -a

# 清理停止的容器
docker container prune

# 清理未使用的卷
docker volume prune

🔧 常见问题排查

问题 1:容器启动失败

1
2
3
4
5
6
7
8
# 查看日志
docker-compose logs app

# 检查配置
docker-compose config

# 检查端口占用
netstat -tlnp | grep 8000

问题 2:数据库连接失败

1
2
3
4
5
6
7
8
# 检查数据库是否运行
docker-compose ps postgres

# 测试连接
docker-compose exec app python -c "from urllib.parse import urlparse; print('OK')"

# 查看数据库日志
docker-compose logs postgres

问题 3:Nginx 无法访问

1
2
3
4
5
6
7
8
# 检查 Nginx 配置
docker-compose exec nginx nginx -t

# 查看 Nginx 日志
docker-compose logs nginx

# 检查证书
ls -la ssl/

🚀 更多应用场景

  • 多环境部署(开发/测试/生产)
  • CI/CD 集成
  • Kubernetes 部署
  • 混合云部署

💬 金句总结

Docker 让部署变得像搭积木一样简单。

一次打包,到处运行,这才是真正的 DevOps。

📚 相关阅读

🔗 联系方式

平台账号/链接
微信扫码加好友
微博@程序员晚枫
知乎@程序员晚枫
抖音@程序员晚枫
小红书@程序员晚枫
B 站Python 自动化办公社区

主营业务:AI 编程培训、企业内训、技术咨询


Docker 部署,一次学会,到处使用!

🎓 AI 编程实战课程

想系统学习 AI 编程?程序员晚枫的 AI 编程实战课 帮你从零上手!